#include <iostream>
#include <string>
#include <regex>

/**
 * 对于正则表达式来讲
 * 我们下面使用的std::regex_match()中有三个参数
 * 1.表示的是传入需要的字符串
 * 2.表示我们想把所得的字符串放到哪里
 * 3.表示我们正则表达式的规则
 * 其中e1中的()表示需要提取出的内容--\d表示的是提取一个常熟，而\d+提取0次或所有的常数
 * 而e2中的
 * 1.(GET|HEAD|POST|PUT|DELETE)表示的是提取其中的某一个-->GET
 * 2. ([^?]*)表示的是从空格开始提取?之前的内容,*表示的是0次或多次-->/wanghaipeng/login
 * 3.\\?(.*) 表示的是从?开始截取到空格为止-->user=xiaoming&pass=123321
 * 4.(HTTP/1\\.[01])首先[01]表示的是0或1，也就是表示从HTTP/1.开始，然后整体也就是-->HTTP/1.0或者HTTP/1.0
 * 5.对于\r\n我们采用的是(?:\n|\r\n)?-->首先(?:...)表示的匹配某个字符串但是不提取,
 *   所以(?:\n|\r\n)表示的就是匹配\n或者\r\n但是不提取，最后的?表示的是匹配前面的表达式0次或1次
 * 6.然后对于我们HTTP中login中有的是没有账号密码的
 *   所以我们根据(?:...)可以把\\?(.*) 更改为(?:\\?(.*))?表示的就是有账号密码了提取，没有了不提取 
*/
int main()
{
    std::string str1 = "/wanghaipeng/174";
    std::regex e1("/wanghaipeng/(\\d+)");
    std::smatch matches1;

    std::string str2 = "GET /wanghaipeng/login?user=xiaoming&pass=123321 HTTP/1.1\r\n";
    //std::regex e2("(GET|HEAD|POST|PUT|DELETE) ([^?]*)\\?(.*) (HTTP/1\\.[01])(?:\n|\r\n)?");
    std::regex e2("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    std::smatch matches2;
 
    bool ret = std::regex_match(str1,matches1,e1);
    if(ret == false)
        return -1;
    for(auto &e : matches1)
    {
        std::cout << e << std::endl;
    }
    bool ret2 = std::regex_match(str2,matches2,e2);
    if(ret == false)
        return -1;
    for(auto &s : matches2)
        std::cout << s << std::endl;
    return 0;
}